/**
 * @file menu.c 客户端界面函数
 *       用于显示菜单和处理用户输入
 *       发起请求到服务器
 * @author pzk (1528089905@qq.com)
 * @brief 
 * @version 1.5
 * @date 2025-8-25
 * 
 * @copyright copyright (c) 2025
 */
#include "client.h"

static struct termios old_termios;  // 保存终端模式

// 无回显模式函数
void enable_raw_mode() 
{
    tcgetattr(STDIN_FILENO, &old_termios);  // 保存当前终端模式
    struct termios new_termios = old_termios;
    new_termios.c_lflag &= ~(ECHO | ICANON);  // 关闭回显和规范模式
    tcsetattr(STDIN_FILENO, TCSANOW, &new_termios);  // 立即生效
}


// 恢复终端模式函数
void disable_raw_mode() 
{
    tcsetattr(STDIN_FILENO, TCSANOW, &old_termios);
}


// 读取密码函数
void read_password(char *password, int max_len) 
{
    int i = 0;
    char c;
    memset(password, 0, max_len);

    enable_raw_mode();  

    while (1) 
    {
        c = getchar();  
        if (c == '\n' || c == '\r') // 回车结束输入
        {  
            break;
        } 
        else if (c == 127 || c == 8) // 处理退格键
        {  
            if (i > 0) 
            {
                i--;
                password[i] = '\0';
                printf("\b \b");  
                fflush(stdout); 
            }
        } 
        else if (i < max_len - 1) // 实时显示*
        { 
            password[i++] = c;
            printf("*");  
            fflush(stdout); 
        }
    }

    disable_raw_mode();  
    password[i] = '\0';  
    printf("\n");  
}


// 清空缓冲函数
void clear_input_buffer() 
{
    int c;
    // 读取缓冲区所有残留字符，直到遇到换行符或文件结束
    while ((c = getchar()) != '\n' && c != EOF)
			;
}


// 错误提示函数
void Error_prompt()
{
    printf("\n╔═════════════════════════════════════════════════════╗\n");
    printf("║               Input error, try again                ║\n");
    printf("║             Press Enter to continue...              ║\n");
	printf("╚═════════════════════════════════════════════════════╝\n");
    clear_input_buffer(); 
}

// 连接服务器函数
int connect_to_server() 
{
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        perror("socket creation failed");
        return -1;
    }
    // 服务器地址配置（根据实际情况填写IP和端口）
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(server_port); // 替换为实际端口
    if (inet_pton(AF_INET, server_ip, &server_addr.sin_addr) <= 0) 
    { // 替换为实际IP
        perror("invalid server IP");
        close(sock);
        return -1;
    }
    // 连接服务器
    if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("connect to server failed");
        close(sock);
        return -1;
    }
    return sock;
}


// 登陆选择主界面
void Login_main_menu() 
{
    int choice;
    char input[32];

    while (1) 
    {
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
		printf("║                     Easy  Chat                      ║\n");
		printf("║                  ---LOGIN MAIN---                   ║\n");
		printf("╚═════════════════════════════════════════════════════╝\n");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                                                     ║\n");
		printf("║                 1. Admin Login                      ║\n");
        printf("║                 2. User Login                       ║\n");
        printf("║                 3. Register                         ║\n");
        printf("║                 4. Quit                             ║\n");   
        printf("║                                                     ║\n");
		printf("╚═════════════════════════════════════════════════════╝\n");
        
        // 输入提示
        printf("Please enter your choice (1-4): ");
        
        // 读取用户输入
        if (fgets(input, sizeof(input), stdin) == NULL) 
        {   
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║           Input error, please try again             ║\n");
            printf("║             Press Enter to continue...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer(); 
            continue;
        }
        
        // 转换为整数
        if (sscanf(input, "%d", &choice) != 1) 
        {
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║          Please enter a valid number (1-4)          ║\n");
            printf("║             Press Enter to continue...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer(); 
            continue;
        }
        
        // 处理选择
        switch (choice) 
        {
            case 1:
                printf("\nEntering Admin Login process...\n");
                sleep(1);
                Alogin_menu();
                break;
            case 2:
                printf("\nEntering User Login process...\n");
                sleep(1);
                Ulogin_menu();
                break;
            case 3:
                printf("\nEntering Registration process...\n");
                sleep(1);
                Register_menu();
                break;
            case 4:
                printf("\nThank you for using, exiting...\n");
                close(client_sock);
                exit(0);
            default:
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║          Please enter a number between 1-4          ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer(); 
        }
    }
}


// 用户注册菜单
void Register_menu() 
{
    users_t user = {0};  // 初始化用户结构体
    char confirm_pw[16] = {0};
    char input[64] = {0};
    int ret;

    while (1)
    {
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                      Easy Chat                      ║\n");
        printf("║                    ---REGISTER---                   ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("╔════════════════════════════════════════════════════════════════════════╗\n");
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("╚════════════════════════════════════════════════════════════════════════╝\n");
        
        // 1. 获取用户名
        printf("\033[10A");  
        while (1) 
        {
            
            printf("║       Enter username (3-31 characters): ");
            fflush(stdout);
            if (fgets(user.user_name, sizeof(user.user_name), stdin) == NULL) 
            {
                printf("\033[8B");  
                Error_prompt();
                printf("\033[15A"); 
                continue;
            }
            user.user_name[strcspn(user.user_name, "\n")] = 0;  // 去除换行符
            
            if (strlen(user.user_name) < 3 || strlen(user.user_name) > 31) 
            {
                printf("\033[8B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║           Username must be 3-31 characters          ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[15A"); 
            } 
            else 
            {
                break;
            }
        }

        // 2. 设置密码
        while (1) 
        {
            printf("║       Enter password (6-15 characters): ");
            fflush(stdout);
            if (fgets(user.user_pw, sizeof(user.user_pw), stdin) == NULL) 
            {
                printf("\033[7B");  
                Error_prompt();
                printf("\033[14A");
                continue;
            }
            user.user_pw[strcspn(user.user_pw, "\n")] = 0;
            
            if (strlen(user.user_pw) < 6 || strlen(user.user_pw) > 15) 
            {
                printf("\033[7B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║           Password must be 6-15 characters          ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[14A");
            } 
            else 
            {
                break;
            }
        }

        // 3. 确认密码
        while (1) 
        {
            printf("║       Confirm password: ");
            fflush(stdout);
            if (fgets(confirm_pw, sizeof(confirm_pw), stdin) == NULL) 
            {
                printf("\033[6B");  
                Error_prompt();
                printf("\033[13A");
                continue;
            }
            confirm_pw[strcspn(confirm_pw, "\n")] = 0;
            
            if (strcmp(user.user_pw, confirm_pw) != 0) 
            {
                printf("\033[6B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║           Passwords do not match, try again         ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[13A");
            } 
            else 
            {
                break;
            }
        }

        // 4. 输入年龄
        while (1) 
        {
            printf("║       Enter age (0-120): ");
            fflush(stdout);
            if (fgets(input, sizeof(input), stdin) == NULL) 
            {
                printf("\033[5B");  
                Error_prompt();
                printf("\033[12A");
            }
            if (sscanf(input, "%d", &user.user_age) != 1 || user.user_age < 0 || user.user_age > 120) 
            {
                printf("\033[5B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║          Invalid age, please enter 0-120            ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[12A");
            } 
            else 
            {
                break;
            }
        }

        // 5. 选择性别
        while (1) 
        {
            printf("║       Enter gender (M/F): ");
            fflush(stdout);
            if (fgets(input, sizeof(input), stdin) == NULL) 
            {
                printf("\033[4B");  
                Error_prompt();
                printf("\033[11A");
            }
            user.sex = toupper(input[0]);  // 转为大写
            if (user.sex == 'M' || user.sex == 'F') 
            {
                break;
            } 
            else 
            {
                printf("\033[4B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║       Invalid gender, please enter M or F           ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[11A");
            }
        }

        // 6. 输入手机号
        while (1) 
        {
            printf("║       Enter phone number (optional, 11 digits): ");
            fflush(stdout);
            if (fgets(user.user_phone, sizeof(user.user_phone), stdin) == NULL) 
            {
                printf("\033[3B");  
                Error_prompt();
                printf("\033[10A");
            }
            user.user_phone[strcspn(user.user_phone, "\n")] = 0;
            
            // 允许为空，不为空则验证长度
            if (strlen(user.user_phone) > 0 && strlen(user.user_phone) != 11) 
            {
                printf("\033[3B");  
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║           Phone number must be 11 digits            ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[10A");
            } 
            else 
            {
                break;
            }
        }

        // 7. 输入邮箱
        while (1) 
        {
            printf("║       Enter email (optional, max 31 characters): ");
            fflush(stdout);
            if (fgets(user.user_email, sizeof(user.user_email), stdin) == NULL) 
            {
                printf("\033[2B");  
                Error_prompt();
                printf("\033[9A");
            }
            user.user_email[strcspn(user.user_email, "\n")] = 0;
            
            if (strlen(user.user_email) > 31) 
            {
                printf("\033[2B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║            Email must be within 31 characters       ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[9A");
            } 
            else 
            {
                break;
            }
        }

        // 8. 输入居住地
        while (1) 
        {
            printf("║       Enter residence (optional, max 15 chars): ");
            fflush(stdout);
            if (fgets(user.user_place, sizeof(user.user_place), stdin) == NULL) 
            {
                printf("\033[1B");  
                Error_prompt();
                printf("\033[8A");
            }
            user.user_place[strcspn(user.user_place, "\n")] = 0;
            
            if (strlen(user.user_place) > 15) 
            {
                printf("\033[1B");  
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║          Residence must be within 15 characters     ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[8A");
            } 
            else 
            {
                break;
            }
        }
        break;
    }
    

    // 初始化无需用户输入的字段
    user.user_state = 0;          // 初始状态：离线
    user.user_friend_num = 0;     // 初始好友数：0
    user.user_group_num = 0;      // 初始群聊数：0

    // 发送注册信息到服务器
    // 格式：REGISTER|用户名|密码|年龄|性别|手机号|邮箱|居住地|好友数|群聊数
    char reg_info[512] = {0};
    snprintf(reg_info, sizeof(reg_info), 
        "REGISTER|%s|%s|%d|%c|%s|%s|%s|%d|%d",
        user.user_name,        // 用户名
        user.user_pw,          // 密码
        user.user_age,         // 年龄
        user.sex,              // 性别
        user.user_phone,       // 手机号
        user.user_email,       // 邮箱
        user.user_place,       // 居住地
        user.user_friend_num,  // 好友数（默认0）
        user.user_group_num    // 群聊数（默认0）
    );

    while (1) 
    {
        printf("\033[6B");
        printf("Sure to add user?(Y/N/Q)");
        char confirm = getchar();
        // 清除输入缓冲区残留字符
        while (getchar() != '\n');

        if (toupper(confirm) == 'Y') 
        {
            // 确认添加，继续构造注册指令
            break;
        } 
        else if (toupper(confirm) == 'Q') 
        {
            // 退出添加流程
            printf("\nAdding user is cancel\n");
            printf("Press Enter to return...");
            clear_input_buffer();
            return;
        } 
        else if (toupper(confirm) == 'N') 
        {
            // 重新输入所有信息
            printf("\nrestar to enter user information...\n");
            sleep(1);
            // 递归调用自身重新开始输入流程
            Register_menu();
            return;
        } 
        else 
        {
            printf("Invalid input, please enter Y/N/Q\n");
        }
    }

    // 发送注册请求到服务器
    ret = send(client_sock, reg_info, strlen(reg_info), 0);
    if (ret < 0) 
    {
        perror("Failed to send registration info");
        printf("Registration failed\n");
    } 
    // 客户端接收服务器响应的部分（在show_register_menu函数中）
    else 
    {
        // 等待服务器响应
        char response[128] = {0};
        if (recv(client_sock, response, sizeof(response), 0) > 0) 
        {
            if (strstr(response, "REGISTER_SUCCESS") != NULL) 
            {
                printf("Registration successful! \n");
            } 
            else 
            {
                printf("Registration failed: %s\n", response);
            }
        }
    }

    printf("Press Enter to return to main menu...");
    clear_input_buffer();
}


// 管理员登录界面
void Alogin_menu() 
{
    char username[32] = {0};
    char password[16] = {0};
    int error_flag = 0, return_flag = 0;
    while (error_flag < LOOPCOUNT)
	{
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                      Easy Chat                      ║\n");
        printf("║                  ---Admin LOGIN---                  ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("╔══════════════════════════════════════════════════════╗\n");
        printf("║                                                      ║\n");
        printf("║             ERROR TIMES:  %-2d                         ║\n", error_flag);
        printf("║                                                      ║\n");
        printf("║             Account:                                 ║\n");
        printf("║                                                      ║\n");
        printf("║             Password:                                ║\n");
        printf("║                                                      ║\n");
        printf("║             Tip: Input \"QUIT\" to exit                ║\n");
        printf("║                                                      ║\n");
        printf("╚══════════════════════════════════════════════════════╝\n");
        
        printf("\033[7A");  // 光标上移6行（定位到账号输入线）
		printf("║             Account: ");
		fflush(stdout);  	// 强制刷新输出，确保光标位置正确
        scanf("%s", username);
		clear_input_buffer();  

        //输入为退出
		if (strcmp(username, "QUIT") == 0)
		{
			return;
		}

        printf("\033[1B");  // 光标下移2行（定位到密码输入线）
		printf("║             Password: ");
		fflush(stdout);
		read_password(password, sizeof(password));
		if (strcmp(password, "QUIT") == 0)
		{
			return;
		}

        // 本地验证管理员账号密码
        if (strcmp(username, ADMIN_NAME) == 0 && strcmp(password, ADMIN_PASS) == 0) 
        {
            printf("\033[3B"); 
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║              Admin login successful!                ║\n");
            printf("║             Press Enter to continue...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer(); 
            // 光标上移（回到顶部）
            
            Admin_main_menu();
            return_flag = 1;

            return;
        } 
        else 
        {
            printf("\033[3B"); 
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║             Account or password error!              ║\n");
            printf("║             Press Enter to continue...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n"); 
            getchar();  
			error_flag++;
        }
        if (return_flag == 1)
		{
			return_flag = 0;
			return ;
		}
    }

    // 重试次数用完
    printf("\033[3B"); 
    printf("\n╔═════════════════════════════════════════════════════╗\n");
    printf("║                 No more attempts left.              ║\n");
    printf("║                Returning to main menu...            ║\n");
	printf("╚═════════════════════════════════════════════════════╝\n"); 
    sleep(1);
}


// 管理员菜单界面
void Admin_main_menu()
{
    int choice;
    char input[32];

    while (1) 
    {
        system("clear");
        
        printf("╔═════════════════════════════════════════════════════╗\n");
		printf("║                     Easy  Chat                      ║\n");
		printf("║                  ---ADMIN MAIN---                   ║\n");
		printf("╚═════════════════════════════════════════════════════╝\n");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                                                     ║\n");
		printf("║                 1. Add    User                      ║\n");
        printf("║                 2. Delete User                      ║\n");
        printf("║                 3. Find   User                      ║\n");
        printf("║                 4. Show   User                      ║\n");   
        printf("║                 0. Exit                             ║\n");
        printf("║                                                     ║\n");
		printf("╚═════════════════════════════════════════════════════╝\n");
     
        printf("Please enter your choice: ");
        
        // 读取用户选择
        if (fgets(input, sizeof(input), stdin) == NULL) 
        {
            Error_prompt();
            continue;
        }
        if (sscanf(input, "%d", &choice) != 1) 
        {
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║            Please enter a valid number              ║\n");
            printf("║             Press Enter to continue...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer();
            continue;
        }
        
        // 处理选择
        switch (choice) 
        {
            case 1:
                Add_user_menu();
                break;
            case 2:
                Delete_user_menu();
                break;
            case 3:
                Find_user_menu();
                break;
            case 4:
                Show_user_menu();
                break;
            case 0:
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║                                                     ║\n");
                printf("║             Returning to main menu...               ║\n");
                printf("║                                                     ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                sleep(1);
                return;
            default:
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║             Invalid choice, enter 0-4               ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
        }
    }
}


// 显示用户列表界面
void Show_user_menu() 
{
    int sort_choice;
    char input[32] = {0};
    char response[4096] = {0};  // 足够大的缓冲区接收用户列表

    while (1)
    {
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                      Easy Chat                      ║\n");
        printf("║                   ---SHOW USER---                   ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                                                     ║\n");
        printf("║                 1. Sort By ID                       ║\n");
        printf("║                 2. Sort By Name                     ║\n");
        printf("║                 0. Return                           ║\n");
        printf("║                                                     ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");

        printf("Please select a sorting method: ");

        // 读取排序方式选择
        if (fgets(input, sizeof(input), stdin) == NULL || 
            sscanf(input, "%d", &sort_choice) != 1 || 
            sort_choice < 0 || sort_choice > 2) 
        {
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║               Input error, try again                ║\n");
            printf("║             Press Enter to continue...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer(); 
            continue;
        }
        if (sort_choice == 0)
        {
            return;
        }

        // 构造请求指令：SHOW_USER|排序方式
        char show_cmd[64] = {0};
        snprintf(show_cmd, sizeof(show_cmd), "%s%d", SHOW_USER_CMD, sort_choice);

        // 发送请求
        if (send(client_sock, show_cmd, strlen(show_cmd), 0) < 0) 
        {
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║               Failed to send request                ║\n");
            printf("║               Press Enter to return...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer(); 
            return;
        }

        // 接收服务器响应
        ssize_t recv_len = recv(client_sock, response, sizeof(response)-1, 0);
        if (recv_len <= 0)
        {
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║               Failed to receive data                ║\n");
            printf("║               Press Enter to return...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer(); 
            return;
        }
        response[recv_len] = '\0';

        // 显示结果
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                      Easy Chat                      ║\n");
        printf("║                   ---SHOW USER---                   ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        
        printf("═════════════════════════════════════════════════════════════════════════════════════════════\n");
        printf("%s\n", response);  // 直接打印服务器返回的格式化列表

        printf("═════════════════════════════════════════════════════════════════════════════════════════════\n");
        printf("Press Enter to return...");
        clear_input_buffer(); 
        fflush(stdin);
    }
}


// 添加用户界面
void Add_user_menu() 
{
    users_t new_user = {0};
    char password[16] = {0};
    char input[64] = {0};
    char response[128] = {0};

    while (1)
    {
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                      Easy Chat                      ║\n");
        printf("║                    ---REGISTER---                   ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("╔════════════════════════════════════════════════════════════════════════╗\n");
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("║                                                                        ║\n");  
        printf("╚════════════════════════════════════════════════════════════════════════╝\n");
    

        // 1. 输入用户名
        printf("\033[10A");
        while (1) 
        {
            printf("║       Enter username (3-31 characters): ");
            fflush(stdout);
            if (fgets(new_user.user_name, sizeof(new_user.user_name), stdin) == NULL) 
            {
                printf("\033[8B");  
                Error_prompt();
                printf("\033[15A"); 
                continue;
            }
            new_user.user_name[strcspn(new_user.user_name, "\n")] = 0;  // 去除换行符
            
            if (strlen(new_user.user_name) < 3 || strlen(new_user.user_name) > 31) 
            {
                printf("\033[8B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║           Username must be 3-31 characters          ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[15A"); 
            } 
            else 
            {
                break;
            }
        }

        // 2. 输入密码
        while (1) 
        {
            printf("║       Enter password (6-15 characters): ");
            fflush(stdout);
            if (fgets(password, sizeof(password), stdin) == NULL) 
            {
                printf("\033[7B");  
                Error_prompt();
                printf("\033[14A");
                continue;
            }
            // 去除换行符
            password[strcspn(password, "\n")] = 0;
            
            if (strlen(password) < 6 || strlen(password) > 15) 
            {
                printf("\033[7B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║           Password must be 6-15 characters          ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[14A");
            } 
            else 
            {
                strncpy(new_user.user_pw, password, sizeof(new_user.user_pw)-1);
                break;
            }
        }

        // 3. 输入年龄
        while (1) 
        {
            printf("║       Enter age (0-120): ");
            fflush(stdout);
            if (fgets(input, sizeof(input), stdin) == NULL) 
            {
                printf("\033[5B");  
                Error_prompt();
                printf("\033[12A");
            }
            if (sscanf(input, "%d", &new_user.user_age) != 1 || new_user.user_age < 0 || new_user.user_age > 120) 
            {
                printf("\033[5B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║          Invalid age, please enter 0-120            ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[12A");
            } 
            else 
            {
                break;
            }
        }

        // 4. 输入性别
        while (1) 
        {
            printf("║       Enter gender (M/F): ");
            fflush(stdout);
            if (fgets(input, sizeof(input), stdin) == NULL) 
            {
                printf("\033[4B");  
                Error_prompt();
                printf("\033[11A");
            }
            new_user.sex = toupper(input[0]);
            if (new_user.sex == 'M' || new_user.sex == 'F') 
            {
                break;
            } 
            else 
            {
                printf("\033[4B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║       Invalid gender, please enter M or F           ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[11A");
            }
        }

        // 5. 输入手机号
         while (1) 
        {
            printf("║       Enter phone number (optional, 11 digits): ");
            fflush(stdout);
            if (fgets(new_user.user_phone, sizeof(new_user.user_phone), stdin) == NULL) 
            {
                printf("\033[3B");  
                Error_prompt();
                printf("\033[10A");
            }
            new_user.user_phone[strcspn(new_user.user_phone, "\n")] = 0;
            
            // 允许为空，不为空则验证长度
            if (strlen(new_user.user_phone) > 0 && strlen(new_user.user_phone) != 11) 
            {
                printf("\033[3B");  
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║           Phone number must be 11 digits            ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[10A");
            } 
            else 
            {
                break;
            }
        }

        // 6. 输入邮箱
        while (1) 
        {
            printf("║       Enter email (optional, max 31 characters): ");
            fflush(stdout);
            if (fgets(new_user.user_email, sizeof(new_user.user_email), stdin) == NULL) 
            {
                printf("\033[2B");  
                Error_prompt();
                printf("\033[9A");
            }
            new_user.user_email[strcspn(new_user.user_email, "\n")] = 0;
            
            if (strlen(new_user.user_email) > 31) 
            {
                printf("\033[2B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║            Email must be within 31 characters       ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[9A");
            } 
            else 
            {
                break;
            }
        }

        // 7. 输入居住地
        while (1) 
        {
            printf("║       Enter residence (optional, max 15 chars): ");
            fflush(stdout);
            if (fgets(new_user.user_place, sizeof(new_user.user_place), stdin) == NULL) 
            {
                printf("\033[1B");  
                Error_prompt();
                printf("\033[8A");
            }
            new_user.user_place[strcspn(new_user.user_place, "\n")] = 0;
            
            if (strlen(new_user.user_place) > 15) 
            {
                printf("\033[1B");  
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║          Residence must be within 15 characters     ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                printf("\033[8A");
            } 
            else 
            {
                break;
            }
        }
        break;
    }
    

    // 固定初始值
    new_user.user_state = 0;    
    new_user.user_friend_num = 0;
    new_user.user_group_num = 0;

    // 构造注册指令
    // 格式：REGISTER|用户名|密码|年龄|性别|手机号|邮箱|居住地|好友数|群聊数
    char register_cmd[512] = {0};
    snprintf(register_cmd, sizeof(register_cmd),
             "%s%s|%s|%d|%c|%s|%s|%s|%d|%d",
             REGISTER_CMD,
             new_user.user_name,
             new_user.user_pw,
             new_user.user_age,
             new_user.sex,
             new_user.user_phone,
             new_user.user_email,
             new_user.user_place,
             new_user.user_friend_num,
             new_user.user_group_num);

    
    while (1) 
    {
        printf("\033[6B");
        printf("Sure to add user?(Y/N/Q)");
        char confirm = getchar();
        // 清除输入缓冲区残留字符
        while (getchar() != '\n');

        if (toupper(confirm) == 'Y') 
        {
            // 确认添加，继续构造注册指令
            break;
        } 
        else if (toupper(confirm) == 'Q') 
        {
            // 退出添加流程
            printf("\nAdding user is cancel\n");
            printf("Press Enter to return...");
            clear_input_buffer();
            return;
        } 
        else if (toupper(confirm) == 'N') 
        {
            // 重新输入所有信息
            printf("\nrestar to enter user information...\n");
            sleep(1);
            // 递归调用自身重新开始输入流程
            Add_user_menu();
            return;
        } 
        else 
        {
            printf("Invalid input, please enter Y/N/Q\n");
        }
    }

    // 发送注册请求到服务器
    if (send(client_sock, register_cmd, strlen(register_cmd), 0) < 0) 
    {
        perror("Failed to send register request");
        printf("Press Enter to continue...");
        getchar();
        return;
    }

    // 接收服务器响应
    if (recv(client_sock, response, sizeof(response)-1, 0) > 0) 
    {
        if (strstr(response, "REGISTER_SUCCESS") != NULL) 
        {
            printf("\nUser added successfully! %s\n", response);
        } 
        else 
        {
            printf("\nFailed to add user: %s\n", response);
        }
    } 
    else 
    {
        printf("\nNo response from server\n");
    }

    printf("Press Enter to return to admin menu...");
    clear_input_buffer();
}


// 查找用户界面
void Find_user_menu() 
{
    int find_type;
    char input[64] = {0};
    char find_cmd[128] = {0};
    char response[4096] = {0}; 

    // 选择查询方式
    while (1) 
    {
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                      Easy Chat                      ║\n");
        printf("║                   ---FIND USER---                   ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                                                     ║\n");
        printf("║                 1. Find By ID                       ║\n");
        printf("║                 2. Find By Name                     ║\n");
        printf("║                 3. Find By Phone                    ║\n");
        printf("║                 0. Return                           ║\n");
        printf("║                                                     ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");

        printf("Please select a find method: ");
        if (fgets(input, sizeof(input), stdin) == NULL) 
        {
            Error_prompt();
            continue;
        }
        if (sscanf(input, "%d", &find_type) != 1 || find_type < 0 || find_type > 3) 
        {
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║          Please enter a valid number(0-3)           ║\n");
            printf("║             Press Enter to continue...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer(); 
            continue;
        }
        if (find_type == 0)
        {
            return;
        }
        else 
        {
            break;
        }
    }
    
    // 根据选择输入对应的值
    char target[64] = {0};

        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                      Easy Chat                      ║\n");
        printf("║                   ---FIND USER---                   ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("\n╔═════════════════════════════════════════════════════╗\n");
        printf("║                                                     ║\n");
        printf("║                                                     ║\n");
        printf("║                                                     ║\n");
		printf("╚═════════════════════════════════════════════════════╝\n");

        switch (find_type) 
        {
            case 1:  // 按ID
                while (1) 
                {   
                    printf("\033[3A");
                    printf("║       Please enter the user ID：");
                    if (fgets(target, sizeof(target), stdin) == NULL) 
                    {
                        Error_prompt(); 
                        continue;
                    }
                    // 验证ID为数字
                    if (strspn(target, "0123456789\n") != strlen(target)) 
                    {
                        printf("\n╔═════════════════════════════════════════════════════╗\n");
                        printf("║              The ID must be a number.               ║\n");
                        printf("║             Press Enter to continue...              ║\n");
                        printf("╚═════════════════════════════════════════════════════╝\n");
                        clear_input_buffer(); 
                    } 
                    else
                    {
                        target[strcspn(target, "\n")] = 0;  // 去除换行符
                        break;
                    }
                }
                break;
            case 2:  // 按用户名
                while (1) 
                {
                    printf("\033[3A");
                    printf("║       Please enter the user name：");
                    if (fgets(target, sizeof(target), stdin) == NULL) 
                    {
                        Error_prompt();
                        continue;
                    }
                    target[strcspn(target, "\n")] = 0;
                    if (strlen(target) < 1) 
                    {
                        printf("\n╔═════════════════════════════════════════════════════╗\n");
                        printf("║             The ID must is not empty.               ║\n");
                        printf("║             Press Enter to continue...              ║\n");
                        printf("╚═════════════════════════════════════════════════════╝\n");
                        clear_input_buffer(); 
                        continue;
                    } 
                    else 
                    {
                        break;
                    }
                }
                break;
            case 3:  // 按手机号
                while (1) 
                {
                    printf("\033[3A");
                    printf("║       Please enter the user phone：");
                    if (fgets(target, sizeof(target), stdin) == NULL) 
                    {
                        Error_prompt();
                        continue;
                    }
                    target[strcspn(target, "\n")] = 0;
                    if (strlen(target) < 1) 
                    {
                        printf("\n╔═════════════════════════════════════════════════════╗\n");
                        printf("║           The phone must is not empty.              ║\n");
                        printf("║             Press Enter to continue...              ║\n");
                        printf("╚═════════════════════════════════════════════════════╝\n");
                        clear_input_buffer(); 
                        continue;
                    } 
                    else 
                    {
                        break;
                    }
                }
                break;
    }
    

    // 构造查询指令格式：FIND_USER|方式|值
    snprintf(find_cmd, sizeof(find_cmd), "%s%d|%s", FIND_USER_CMD, find_type, target);

    // 发送请求到服务器
    if (send(client_sock, find_cmd, strlen(find_cmd), 0) < 0) 
    {
        printf("\n╔═════════════════════════════════════════════════════╗\n");
        printf("║               Failed to send request                ║\n");
        printf("║               Press Enter to return...              ║\n");
		printf("╚═════════════════════════════════════════════════════╝\n");
        clear_input_buffer(); 
        return;
    }

    // 接收服务器响应
    ssize_t recv_len = recv(client_sock, response, sizeof(response)-1, 0);
    if (recv_len > 0) 
    {
        response[recv_len] = '\0';
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                      Easy Chat                      ║\n");
        printf("║                   ---SHOW USER---                   ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("═════════════════════════════════════════════════════════════════════════════════════════════\n");
        
        if (strstr(response, "FIND_SUCCESS") != NULL) 
        {
            printf("%s\n", response + strlen("FIND_SUCCESS|"));
            printf("═════════════════════════════════════════════════════════════════════════════════════════════\n");

        } 
        else 
        {
            printf("%s\n", response);
            printf("═════════════════════════════════════════════════════════════════════════════════════════════\n");

        }
    } 
    else 
    {
        printf("\n╔═════════════════════════════════════════════════════╗\n");
        printf("║               Failed to receive data                ║\n");
        printf("║               Press Enter to return...              ║\n");
		printf("╚═════════════════════════════════════════════════════╝\n");
        clear_input_buffer(); 
        return;
    }

    printf("Press Enter to return...");
    clear_input_buffer(); 
    fflush(stdin);
}


// 删除用户界面
void Delete_user_menu() 
{
    int choice;
    char input[64] = {0};
    char delete_cmd[128] = {0};
    char response[128] = {0};

    while (1) 
    {
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                      Easy Chat                      ║\n");
        printf("║                  ---DELETE USER---                  ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
       printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                                                     ║\n");
        printf("║                 1. Delete By Name                   ║\n");
        printf("║                 2. Delete By ID                     ║\n");
        printf("║                 3. Delete By Phone                  ║\n");
        printf("║                 0. Return                           ║\n");
        printf("║                                                     ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("Please select a delete method: ");

        // 读取选择
        if (fgets(input, sizeof(input), stdin) == NULL) 
        {
            Error_prompt();
            continue;
        }
        if (sscanf(input, "%d", &choice) != 1 || choice < 0 || choice > 3) 
        {
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║          Please enter a valid number(0-3)           ║\n");
            printf("║             Press Enter to continue...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer(); 
            continue;
        }
        if (choice == 0)
        {
            return;
        }
        else 
        {
            system("clear");
            printf("╔═════════════════════════════════════════════════════╗\n");
            printf("║                      Easy Chat                      ║\n");
            printf("║                   ---FIND USER---                   ║\n");
            printf("╚═════════════════════════════════════════════════════╝\n");
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║                                                     ║\n");
            printf("║                                                     ║\n");
            printf("║                                                     ║\n");
            printf("╚═════════════════════════════════════════════════════╝\n");
            // 根据选择获取删除条件并构造指令
            switch (choice) 
            {
                case 1: 
                    char username[32] = {0};
                    while (1) 
                    {   
                        printf("\033[3A");
                        printf("║       Please enter the user name：");
                        if (fgets(username, sizeof(username), stdin) == NULL) 
                        {
                            Error_prompt();
                            continue;
                        }
                        username[strcspn(username, "\n")] = 0;
                        snprintf(delete_cmd, sizeof(delete_cmd), "%sNAME|%s", DELETE_CMD, username);
                        break;
                    }
                    break;
                case 2: 
                // 按用户ID删除
                    int user_id;
                    while (1)
                    {
                        printf("\033[3A");
                        printf("║       Please enter the user ID：");
                        if (fgets(input, sizeof(input), stdin) == NULL || 
                            sscanf(input, "%d", &user_id) != 1) 
                        {
                            Error_prompt();
                                continue;
                        }
                        snprintf(delete_cmd, sizeof(delete_cmd), "%sID|%d", DELETE_CMD, user_id);
                        break;
                    }
                    break;
                case 3: 
                { // 按手机号删除
                    char phone[16] = {0};
                    while (1)
                    {
                        printf("\033[3A");
                        printf("║       Please enter the user phone：");
                        if (fgets(phone, sizeof(phone), stdin) == NULL) 
                        {
                            Error_prompt();
                            continue;
                        }
                        phone[strcspn(phone, "\n")] = 0;
                        snprintf(delete_cmd, sizeof(delete_cmd), "%sPHONE|%s", DELETE_CMD, phone);
                        break;
                    }
                }
                break;
            }

            // 发送删除请求到服务器
            if (send(client_sock, delete_cmd, strlen(delete_cmd), 0) < 0) 
            {
                printf("\033[2B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║               Failed to send request                ║\n");
                printf("║               Press Enter to return...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer(); 
                return;
            }

            // 接收服务器响应
            if (recv(client_sock, response, sizeof(response)-1, 0) > 0) 
            {
                if (strstr(response, "DELETE_SUCCESS") != NULL)
                {
                    printf("\033[2B");
                    printf("╔═════════════════════════════════════════════════════╗\n");
                    printf("║              Delete User Successfully               ║\n");
                    printf("║               Press Enter to return...              ║\n");
                    printf("╚═════════════════════════════════════════════════════╝\n");
                    clear_input_buffer(); 
                    return;
                } 
                else 
                {
                    printf("\033[2B");
                    printf("\n╔═════════════════════════════════════════════════════╗\n");
                    printf("║                 Delete User Failed                  ║\n");
                    printf("║                 %s\n", response);
                    printf("║               Press Enter to return...              ║\n");
                    printf("╚═════════════════════════════════════════════════════╝\n");

                    clear_input_buffer(); 
                    return;
                }
            } 
            else 
            {
                printf("\033[2B");
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║               Failed to receive data                ║\n");
                printf("║               Press Enter to return...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer(); 
                return;
            }
        }
    }
    
    
   
}
    

// 登录响应辅助函数
void handle_login_response(const char *response)
{
    // 先检查响应是否为空
    SYSERR2(response, ==, NULL, "Login response is empty",return )

    // 确认响应包含LOGIN_SUCCESS
    if (strstr(response, "LOGIN_SUCCESS") == NULL) 
    {
        printf("\n╔═════════════════════════════════════════════════════╗\n");
        printf("║                User login failed!                   ║\n");
        printf("║                                                     ║\n");
        printf("║             Press Enter to continue...              ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("\033[3A");
        printf("║                  %s\n", response);
        printf("\033[3B");
        clear_input_buffer(); 
        return;
    }

    // 创建足够大的缓冲区
    char response_copy[256];
    // 复制并确保字符串结束符
    strncpy(response_copy, response, sizeof(response_copy) - 1);
    response_copy[sizeof(response_copy) - 1] = '\0';

    char *token = strtok(response_copy, "|");
    if (!token || strcmp(token, "LOGIN_SUCCESS") != 0) 
    {
        printf("\n╔═════════════════════════════════════════════════════╗\n");
        printf("║                 ERROR  LOGIN_SUCCESS                ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        return;
    }

    // 解析用户ID
    token = strtok(NULL, "|");
    if (!token || !isdigit(token[0])) 
    {   // 确保ID是数字
        printf("\n╔═════════════════════════════════════════════════════╗\n");
        printf("║                    ERROR  USER_ID                   ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        return;
        current_user_id = -1;  // 明确标记无效
        return;
    }
    current_user_id = atoi(token);

    // 解析用户名
    token = strtok(NULL, "|");
    if (!token || strlen(token) == 0) 
    {   // 确保用户名不为空
        printf("\n╔═════════════════════════════════════════════════════╗\n");
        printf("║                   ERROR  USER_NAME                  ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        current_username[0] = '\0';
        return;
    }
    // 安全复制用户名，防止缓冲区溢出
    strncpy(current_username, token, sizeof(current_username) - 1);
    current_username[sizeof(current_username) - 1] = '\0';

    // 解析成功，打印并进入主菜单
    printf("\n╔═════════════════════════════════════════════════════╗\n");
    printf("║              Admin login successful!                ║\n");
    printf("║               Welcome,                              ║\n");
    printf("║             Press Enter to continue...              ║\n");
    printf("╚═════════════════════════════════════════════════════╝\n");
    printf("\033[3A");
    printf("║               Welcome, %s\n", current_username);
    printf("\033[3B");
    clear_input_buffer(); 
}


// 用户登录界面
void Ulogin_menu() 
{
    char username[32] = {0};
    char password[16] = {0};
    int ret;
    int error_flag = 0;
    char login_cmd[128] = {0};
    char response[128] = {0};
    
    while (error_flag < LOOPCOUNT)
    {
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                      Easy Chat                      ║\n");
        printf("║                   ---User LOGIN---                  ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("╔══════════════════════════════════════════════════════╗\n");
        printf("║                                                      ║\n");
        printf("║             ERROR TIMES:  %-2d                         ║\n", error_flag);
        printf("║                                                      ║\n");
        printf("║             Account:                                 ║\n");
        printf("║                                                      ║\n");
        printf("║             Password:                                ║\n");
        printf("║                                                      ║\n");
        printf("║             Tip: Input \"QUIT\" to exit                ║\n");
        printf("║                                                      ║\n");
        printf("╚══════════════════════════════════════════════════════╝\n");
        
        printf("\033[7A");  // 光标上移6行（定位到账号输入线）
		printf("║             Account: ");
		fflush(stdout);  	// 强制刷新输出，确保光标位置正确
        scanf("%s", username);
		clear_input_buffer(); 
        
        //输入为退出
		if (strcmp(username, "QUIT") == 0)
		{
			return;
		}

        printf("\033[1B");  // 光标下移2行（定位到密码输入线）
		printf("║             Password: ");
		fflush(stdout);
		read_password(password, sizeof(password));
		if (strcmp(password, "QUIT") == 0)
		{
			return;
		}

        // 检查用户名和密码是否为空
        if (strlen(username) == 0 || strlen(password) == 0) 
        {
            printf("\033[3B"); 
            printf("Username and password cannot be empty\n");

            error_flag++;
            continue;
        }

        // 构造登录指令
        // 格式：LOGIN_CMD|用户名|密码
        
        snprintf(login_cmd, sizeof(login_cmd), 
                 "%s%s|%s",  
                 LOGIN_CMD, 
                 username, 
                 password);

        // 发送登录请求
        ret = send(client_sock, login_cmd, strlen(login_cmd), 0);
        if (ret < 0) 
        {
            perror("Failed to send login request");
            error_flag++;
            continue;
        }
        // 接收服务器响应
        if (recv(client_sock, response, sizeof(response)-1, 0) > 0) 
        {
            if (strstr(response, "LOGIN_SUCCESS") != NULL) 
            {
                printf("\033[3B"); 
                handle_login_response(response);
                error_flag = 0;
                User_main_menu();
                return;
            } 
            else 
            {
                error_flag++;
                printf("\033[3B"); 
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║             Invalid username or password            ║\n");
                printf("║                Press Enter to continue...           ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer(); 
                continue;
            }
        } 
        else 
        {
            error_flag++;
            printf("Failed to receive response from server\n");
        }
    }

    // 重试次数用完
    printf("\n╔═════════════════════════════════════════════════════╗\n");
    printf("║                 No more attempts left.              ║\n");
    printf("║                 Press Enter to return...            ║\n");
	printf("╚═════════════════════════════════════════════════════╝\n"); 
    clear_input_buffer(); 
    return;
}


// 用户菜单界面  
void User_main_menu()
{
    int choice;
    char input[32];
    int running = 1;
    fd_set read_fds;
    struct timeval tv;

    while (running) 
    {
        system("clear");

        printf("╔═════════════════════════════════════════════════════╗\n");
		printf("║                     Easy Chat                       ║\n");
		printf("║                  ---USER MAIN---                    ║\n");
		printf("╚═════════════════════════════════════════════════════╝\n");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                                                     ║\n");
		printf("║               1. Show Online                        ║\n");
        printf("║               2. Private chat                       ║\n");
        printf("║               3. Group   chat(unfinished)           ║\n");
        printf("║               4. Friend  chat(unfinished)           ║\n"); 
        printf("║               5. Add  Friend(unfinished)            ║\n"); 
        printf("║               0. Exit                               ║\n");
        printf("║                                                     ║\n");
		printf("╚═════════════════════════════════════════════════════╝\n");
        printf("Please enter your choice: ");
        fflush(stdout);  

        // 使用 select 同时监听用户输入和服务器消息
        FD_ZERO(&read_fds);
        FD_SET(STDIN_FILENO, &read_fds);
        FD_SET(client_sock, &read_fds);
        
        tv.tv_sec = 1;  // 1秒超时
        tv.tv_usec = 0;
        
        //获取监听集合中最大的文件描述符
        int max_fd = (client_sock > STDIN_FILENO) ? client_sock : STDIN_FILENO;
        int ret = select(max_fd + 1, &read_fds, NULL, NULL, &tv);
        
        SYSERR2(ret, <, 0, "select failed", continue);
        
        // 检查是否有来自服务器的消息
        if (FD_ISSET(client_sock, &read_fds)) 
        {
            char buf[1024] = {0};
            ssize_t recv_len = recv(client_sock, buf, sizeof(buf)-1, 0);
            
            SYSERR2(recv_len, <= , 0,"Disconnected from server", break);
            
            buf[recv_len] = '\0';
            
            //收到私聊请求
            if (strstr(buf, "PRIVATE_REQUEST") == buf) 
            {
                // 处理私聊请求 格式：PRIVATE_REQUEST|发送者ID|发送者名字
                char *sender_id_str = strtok(buf + strlen(PRIVATE_REQUEST), "|");
                char *sender_name = strtok(NULL, "|");
                
                if (sender_id_str && sender_name) 
                {
                    int sender_id = atoi(sender_id_str);
                    printf("\n╔═════════════════════════════════════════════════════╗\n");
                    printf("║            Received a private chat request          ║\n");
                    printf("║                                                     ║\n");
                    printf("║                Do you accept? (y/n):                ║\n");
                    printf("╚═════════════════════════════════════════════════════╝\n");
                    printf("\033[3A");
                    printf("║                 From %s(ID: %d)\n", sender_name, sender_id);
                    printf("║                Do you accept? (y/n):");
                    fflush(stdout);
                    
                    char response[16] = {0};
                    if (fgets(response, sizeof(response), stdin) != NULL) 
                    {
                        if (response[0] == 'y' || response[0] == 'Y') 
                        {
                            // 接受私聊
                            // 发送接受消息给服务器 
                            // 格式：PRIVATE_ACCEPT|当前用户ID|发送者ID
                            char accept_msg[64] = {0};
                            snprintf(accept_msg, sizeof(accept_msg), 
                                     "PRIVATE_ACCEPT|%d|%d", current_user_id, sender_id);
                            send(client_sock, accept_msg, strlen(accept_msg), 0);
                            printf("\n╔═════════════════════════════════════════════════════╗\n");
                            printf("║            Private chat request accepted            ║\n");
                            printf("╚═════════════════════════════════════════════════════╝\n");
                            // 进入私聊界面
                            Private_chat_with(sender_id, sender_name);
                        } 
                        else 
                        {
                            // 拒绝私聊
                            // 发送拒绝消息给服务器
                            // 格式：PRIVATE_REFUSE|当前用户ID|发送者ID
                            char refuse_msg[64] = {0};
                            snprintf(refuse_msg, sizeof(refuse_msg), 
                                     "PRIVATE_REFUSE|%d|%d", current_user_id, sender_id);
                            send(client_sock, refuse_msg, strlen(refuse_msg), 0);
                            printf("\n╔═════════════════════════════════════════════════════╗\n");
                            printf("║            Private chat request refused             ║\n");
                            printf("╚═════════════════════════════════════════════════════╝\n");
                        }
                    }
                }
            } 
            //收到私聊接受通知
            else if (strstr(buf, "PRIVATE_ACCEPT") == buf) 
            {
                char *acceptor_id_str = strtok(buf + strlen(PRIVATE_ACCEPT), "|");
                char *acceptor_name = strtok(NULL, "|");
                
                if (acceptor_id_str && acceptor_name) 
                {
                    int acceptor_id = atoi(acceptor_id_str);
                    printf("\n╔═════════════════════════════════════════════════════╗\n");
                    printf("║            Private chat request accepted            ║\n");
                    printf("║                                                     ║\n");
                    printf("║               Press Enter to chat...                ║\n");
                    printf("╚═════════════════════════════════════════════════════╝\n");
                    printf("\033[3A");
                    printf("║                by %s(ID: %d)\n", acceptor_name, acceptor_id);
                    fflush(stdout);
                    printf("按回车键进入私聊界面...");
                    fflush(stdout);
                    clear_input_buffer();
                    // 进入私聊界面
                    Private_chat_with(acceptor_id, acceptor_name);
                }
            } 
            // 处理私聊消息
            else if (strstr(buf, "PRIVATE_MSG") == buf) 
            {
                // 处理私聊消息
                char *sender_id_str = strtok(buf + strlen(PRIVATE_MSG), "|");
                char *message = strtok(NULL, "|");
                
                if (sender_id_str && message) 
                {
                    int sender_id = atoi(sender_id_str);
                    printf("\n[收到来自 %d 的消息]: %s\n", sender_id, message);
                    printf("按回车键继续...");
                    fflush(stdout);
                    clear_input_buffer();
                }
            } 
            //收到私聊拒绝通知
            else if (strstr(buf, "PRIVATE_REFUSE") == buf) 
            {
                char *refuser_id_str = strtok(buf + strlen(PRIVATE_REFUSE), "|");
                
                if (refuser_id_str) 
                {
                    int refuser_id = atoi(refuser_id_str);
                    printf("\n╔═════════════════════════════════════════════════════╗\n");
                    printf("║            Private chat request refused             ║\n");
                    printf("║                                                     ║\n");
                    printf("║              Press Enter to continue...             ║\n");
                    printf("╚═════════════════════════════════════════════════════╝\n");
                    printf("\033[3A");
                    printf("║                by %d\n", refuser_id);
                    fflush(stdout);
                    clear_input_buffer();
                }
            } 
            //收到私聊退出通知
            else if (strstr(buf, "PRIVATE_EXIT") == buf) 
            {
                char *exiter_id_str = strtok(buf + strlen(PRIVATE_EXIT), "|");
                
                if (exiter_id_str) 
                {
                    //int exiter_id = atoi(exiter_id_str);
                    printf("\n╔═════════════════════════════════════════════════════╗\n");
                    printf("║                    Exited chat                      ║\n");
                    printf("║              Press Enter to continue...             ║\n");
                    printf("╚═════════════════════════════════════════════════════╝\n");
                    fflush(stdout);
                    clear_input_buffer();
                }
            } 
            // 收到用户不在线通知
            else if (strstr(buf, "USER_OFFLINE") == buf) 
            {
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║                   user is offline                   ║\n");
                printf("║              Press Enter to continue...             ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                fflush(stdout);
                clear_input_buffer();
            }
        }
        
        // 检查用户输入
        if (FD_ISSET(STDIN_FILENO, &read_fds)) 
        {
            if (fgets(input, sizeof(input), stdin) == NULL) 
            {
                Error_prompt();
                continue;
            }

            // 解析输入
            if (sscanf(input, "%d", &choice) != 1) 
            {
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║          Please enter a valid number(0-5)           ║\n");
                printf("║             Press Enter to continue...              ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                continue;
            }

            // 处理用户选择
            switch (choice) 
            {
                case 1:
                    Show_online_menu();
                    break;
                case 2:
                    Private_chat_menu();
                    break;
                case 3:
                    Group_chat_menu();
                    break;
                case 4:
                    Friend_chat_menu();
                    break;
                case 5:
                    Add_friend_menu();
                    break;
                case 0:
                    printf("\n╔═════════════════════════════════════════════════════╗\n");
                    printf("║                  Sure to exit?(Y/N)                 ║\n");
                    printf("╚═════════════════════════════════════════════════════╝\n");
                    fflush(stdout);
                    if (fgets(input, sizeof(input), stdin) != NULL && 
                        (input[0] == 'y' || input[0] == 'Y')) {
                        // 发送登出请求
                        char logout_cmd[64] = {0};
                        snprintf(logout_cmd, sizeof(logout_cmd), "%s%d", LOGOUT_CMD, current_user_id);
                        send(client_sock, logout_cmd, strlen(logout_cmd), 0); // 忽略发送结果，确保退出
                        
                        // 关闭旧连接
                        close(client_sock);
                        // 重新连接服务器
                        client_sock = connect_to_server();
                        if (client_sock < 0) {
                            printf("重新连接服务器失败，程序将退出...\n");
                            exit(1); // 连接失败时退出（或根据需求处理）
                        }
                        
                        // 清除当前用户信息
                        current_user_id = -1;
                        current_username[0] = '\0';
                        running = 0;
                    } else {
                        printf("Cancel to exit\n");
                        sleep(1);
                    }
                    break;
                default:
                    printf("\n╔═════════════════════════════════════════════════════╗\n");
                    printf("║          Please enter a valid number(0-5)           ║\n");
                    printf("║             Press Enter to continue...              ║\n");
                    printf("╚═════════════════════════════════════════════════════╝\n");
                    clear_input_buffer();
                    break;
            }
        }
    }
}


// 显示在线用户列表菜单
void Show_online_menu()
{
    int ret;
    
    // 发送获取在线用户请求
    ret = send(client_sock, "GET_ONLINE", strlen("GET_ONLINE"), 0);
    SYSERR2(ret , < , 0 , "send failed",return);
    
    // 接收服务器响应
    char buffer[2048] = {0};
    ssize_t recv_len = recv(client_sock, buffer, sizeof(buffer)-1, 0);
    SYSERR2(recv_len,<=,0,"recv failed",return);
    
    buffer[recv_len] = '\0';
    
    // 解析响应格式：ONLINE|数量|序号|ID|姓名
    char *token = strtok(buffer, "|");
    if (!token || strcmp(token, "ONLINE") != 0) 
    {
        printf("Invalid response format\n");
        return;
    }
    
    // 4. 提取用户数量
    token = strtok(NULL, "|");
    if (!token) 
    {
        printf("Failed to get the number of users\n");
        return;
    }
    int user_count = atoi(token);
    
    // 5. 显示在线用户列表
    system("clear");
    printf("╔═════════════════════════════════════════════════════╗\n");
    printf("║                     Easy Chat                       ║\n");
    printf("║                  ---SHOW ONLINE---                  ║\n");
    printf("╚═════════════════════════════════════════════════════╝\n");
    printf("══════════════════════\n");
    printf("序号\tID\t姓名\n");
    
    if (user_count == 0) 
    {
        printf("No user is online!!!\n");
    } 
    else 
    {
        // 循环解析每个用户的信息
        for (int i = 0; i < user_count; i++) 
        {
            char *index_str = strtok(NULL, "|");
            char *id_str = strtok(NULL, "|");
            char *name = strtok(NULL, "|");
            
            if (index_str && id_str && name) 
            {
                printf("%s\t%s\t%s\n", index_str, id_str, name);
            }
        }
    }
    
    printf("══════════════════════\n");
    printf("Press Enter to return...");
    getchar();  // 等待用户按键
}


// 用户私聊界面
void Private_chat_menu() 
{
    int target_id;
    char input[1024] = {0};
    char send_buf[1024] = {0};
    char recv_buf[1024] = {0};
    fd_set read_fds;
    struct timeval tv;
    int ret;

    // 获取目标用户ID
    while (1) 
    {
        system("clear");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║                     Easy Chat                       ║\n");
        printf("║                 ---PRIVATE CHAT---                  ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        printf("\n╔══════════════════════════════════════════════════════════╗\n");
        printf("║                                                          ║\n");
        printf("║                                                          ║\n");
        printf("║                                                          ║\n");
        printf("╚══════════════════════════════════════════════════════════╝\n");
        printf("\033[3A");
        printf("║      Please enter ID to chat(0 to return)：");
        if (fgets(input, sizeof(input), stdin) == NULL) 
        {   
            printf("\033[3B");
            Error_prompt();
            continue;
        }
        if (sscanf(input, "%d", &target_id) != 1) 
        {
            printf("\033[3B");
            printf("╔═════════════════════════════════════════════════════╗\n");
            printf("║          Please enter a valid number                ║\n");
            printf("║             Press Enter to continue...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer(); 
            continue;
        }
        if (target_id == 0) 
        {  
            return;
        }
        // 不能和自己聊天
        if (target_id == current_user_id) 
        {  
            printf("\033[3B");
            printf("\n╔═════════════════════════════════════════════════════╗\n");
            printf("║                 The ID is yourself                  ║\n");
            printf("║             Press Enter to continue...              ║\n");
		    printf("╚═════════════════════════════════════════════════════╝\n");
            clear_input_buffer(); 
            continue;
        }
        break;
    }

    // 发送私聊请求
    snprintf(send_buf, sizeof(send_buf), "%s%d|%d", 
             PRIVATE_REQUEST, current_user_id, target_id);
    if (send(client_sock, send_buf, strlen(send_buf), 0) < 0) 
    {
        printf("\033[3B");
        printf("\n╔═════════════════════════════════════════════════════╗\n");
        printf("║         Failed to send private chat request         ║\n");
        printf("║             Press Enter to continue...              ║\n");
		printf("╚═════════════════════════════════════════════════════╝\n");
        clear_input_buffer(); 
        return;
    }

    // 等待服务器响应
    memset(recv_buf, 0, sizeof(recv_buf));
    if (recv(client_sock, recv_buf, sizeof(recv_buf)-1, 0) <= 0) 
    {
        printf("\033[3B");
        printf("\n╔═════════════════════════════════════════════════════╗\n");
        printf("║           Connection with server interrupted        ║\n");
        printf("║             Press Enter to return...                ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        clear_input_buffer();
        return;
    }

    if (strstr(recv_buf, "USER_OFFLINE") != NULL) 
    {
        printf("\033[3B");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║               User is not online                    ║\n");
        printf("║         Press any key to return...                  ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        clear_input_buffer();
        return;
    } 
    else if (strstr(recv_buf, "PRIVATE_REQUEST_SENT") != NULL) 
    {
        printf("\033[3B");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║     Private chat request sent, waiting for reply... ║\n");
        printf("║         Enter 'q' to cancel waiting                 ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
    } 
    else 
    {
        printf("\033[3B");
        printf("╔═════════════════════════════════════════════════════╗\n");
        printf("║         Unknown response: %-26s                     ║\n", recv_buf);
        printf("║             Press Enter to return...                ║\n");
        printf("╚═════════════════════════════════════════════════════╝\n");
        clear_input_buffer();
        getchar();
        return;
    }

    // 等待对方响应
    while (1) 
    {
        FD_ZERO(&read_fds);
        FD_SET(client_sock, &read_fds);
        FD_SET(STDIN_FILENO, &read_fds);
        
        tv.tv_sec = 1;
        tv.tv_usec = 0;
        
        int max_fd = (client_sock > STDIN_FILENO) ? client_sock : STDIN_FILENO;
        ret = select(max_fd + 1, &read_fds, NULL, NULL, &tv);
        
        if (ret < 0) {
            perror("select error");
            break;
        }
        
        // 检查用户输入
        if (FD_ISSET(STDIN_FILENO, &read_fds)) 
        {
            if (fgets(input, sizeof(input), stdin) != NULL) 
            {
                input[strcspn(input, "\n")] = 0; // 移除换行符
                
                if (strcmp(input, "q") == 0) 
                {
                    printf("Private chat request cancelled\n");
                    return;
                }
            }
        }
        
        // 检查服务器消息
        if (FD_ISSET(client_sock, &read_fds)) 
        {
            memset(recv_buf, 0, sizeof(recv_buf));
            ssize_t recv_len = recv(client_sock, recv_buf, sizeof(recv_buf)-1, 0);
            
            if (recv_len <= 0) 
            {
                printf("Connection with the server has been interrupted\n");
                return;
            }
            
            recv_buf[recv_len] = '\0';
            
            if (strstr(recv_buf, "PRIVATE_ACCEPT") != NULL) 
            {
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║    The other party has accepted the chat request    ║\n");
                printf("║           You can start chatting now!               ║\n");
                printf("║      Enter message and press Enter to send          ║\n");
                printf("║        type'/exit' to quit private chat             ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                
                // 进入私聊界面
                char *sender_id_str = strtok(recv_buf + strlen(PRIVATE_ACCEPT), "|");
                char *sender_name = strtok(NULL, "|");
                
                if (sender_id_str && sender_name) 
                {
                    int sender_id = atoi(sender_id_str);
                    Private_chat_with(sender_id, sender_name);
                }
                break;
            } 
            else if (strstr(recv_buf, "PRIVATE_REFUSE") != NULL) 
            {
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║        The other party rejected the chat request    ║\n");
                printf("║             Press Enter to return...                ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                return;
            } 
            else if (strstr(recv_buf, "USER_OFFLINE") != NULL) 
            {
                printf("\n╔═════════════════════════════════════════════════════╗\n");
                printf("║             The other party has gone offline        ║\n");
                printf("║             Press Enter to return...                ║\n");
                printf("╚═════════════════════════════════════════════════════╝\n");
                clear_input_buffer();
                return;
            }
        }
    }
}


// 与指定用户进行私聊
void Private_chat_with(int target_id, const char *target_name) 
{
    char input[128] = {0};
    char send_buf[1024] = {0};
    char recv_buf[1024] = {0};
    fd_set read_fds;
    struct timeval tv;
    int ret;
    int in_chat = 1;

    system("clear");
    
    printf("═════════════════════════════════════════\n");
    printf("         With %s(ID: %d) chatting          \n", target_name, target_id);
    printf("═════════════════════════════════════════\n");
    printf("Enter a message and press \'Enter\' to send\n");
    printf("enter '/exit' to quit private chat\n");

    // 私聊会话
    while (in_chat) 
    {
        FD_ZERO(&read_fds);
        FD_SET(client_sock, &read_fds);
        FD_SET(STDIN_FILENO, &read_fds);
        
        tv.tv_sec = 1;
        tv.tv_usec = 0;
        
        int max_fd = (client_sock > STDIN_FILENO) ? client_sock : STDIN_FILENO;
        ret = select(max_fd + 1, &read_fds, NULL, NULL, &tv);
        SYSERR2(ret,<,0,"select failed",break);
        
        // 检查用户输入
        if (FD_ISSET(STDIN_FILENO, &read_fds)) 
        {
            if (fgets(input, sizeof(input), stdin) != NULL) 
            {
                input[strcspn(input, "\n")] = 0; // 移除换行符
                
                if (strcmp(input, "/exit") == 0) 
                {
                    // 退出私聊
                    snprintf(send_buf, sizeof(send_buf), "%s%d|%d", 
                             PRIVATE_EXIT, current_user_id, target_id);
                    send(client_sock, send_buf, strlen(send_buf), 0);
                    printf("exiting private chat...\n");
                    break;
                }
                else if (strcmp(input, "/info") == 0) 
                {
                    // 发送查看用户信息请求
                    // 格式: USER_INFO|当前用户ID|目标用户ID
                    snprintf(send_buf, sizeof(send_buf), "%s%d|%d", 
                            USER_INFO_CMD, current_user_id, target_id);
                    if (send(client_sock, send_buf, strlen(send_buf), 0) < 0) 
                    {
                        perror("Send info request failed");
                        continue;
                    }
                    
                    // 等待服务器响应
                    char info_buf[512] = {0};
                    ssize_t info_len = recv(client_sock, info_buf, sizeof(info_buf)-1, 0);
                    if (info_len > 0) 
                    {
                        info_buf[info_len] = '\0';
                        
                        if (strstr(info_buf, "USER_INFO|") == info_buf) 
                        {
                            // 解析用户信息
                            char *token = strtok(info_buf + strlen("USER_INFO|"), "|");
                            if (token) 
                            {
                                printf("User information - %s\n", target_name);
                                printf("ID: %s\n", token);
                                token = strtok(NULL, "|");
                                if (token) printf("Name: %s\n", token);
                                token = strtok(NULL, "|");
                                if (token) printf("Age: %s\n", token);
                                token = strtok(NULL, "|");
                                if (token) printf("Sex: %s\n", token);
                                token = strtok(NULL, "|");
                                if (token) printf("Phone: %s\n", token);
                                token = strtok(NULL, "|");
                                if (token) printf("Email: %s\n", token);
                                token = strtok(NULL, "|");
                                if (token) printf("Palace: %s\n", token);
                                token = strtok(NULL, "|");
                                if (token) printf("Friends number: %s\n", token);
                                token = strtok(NULL, "|");
                                if (token) printf("Groups number: %s\n", token);
                            }
                        } 
                        else 
                        {
                            printf("Get user info error: %s\n", info_buf);
                        }
                    }
                }
                else if (strlen(input) > 0) 
                {
                    // 发送消息
                    snprintf(send_buf, sizeof(send_buf), "%s%d|%d|%s", 
                             PRIVATE_MSG, current_user_id, target_id, input);
                    if (send(client_sock, send_buf, strlen(send_buf), 0) < 0) 
                    {
                        perror("Send message failed");
                        break;
                    }
                    
                    // 清除输入行并显示格式化消息
                    printf("\033[1A\033[2K"); // 移动光标到上一行并清除该行
                    printf("[me]: %s\n", input);
                }
            }
        }
        
        // 检查服务器消息
        if (FD_ISSET(client_sock, &read_fds)) 
        {
            memset(recv_buf, 0, sizeof(recv_buf));
            ssize_t recv_len = recv(client_sock, recv_buf, sizeof(recv_buf)-1, 0);
            SYSERR2(recv_len ,<= ,0,"recv failed",break);

            
            recv_buf[recv_len] = '\0';
            
            if (strstr(recv_buf, "PRIVATE_MSG") == recv_buf) 
            {
                // 收到私聊消息
                char *sender_id_str = strtok(recv_buf + strlen(PRIVATE_MSG), "|");
                char *message = strtok(NULL, "|");
                
                if (sender_id_str && message) 
                {
                    //int sender_id = atoi(sender_id_str);
                    printf("[%s]: %s\n", target_name, message);
                }
            } 
            else if (strstr(recv_buf, "PRIVATE_EXIT") != NULL) 
            {
                printf("The other has exited the private chat\n");
                break;
            } 
            else if (strstr(recv_buf, "USER_OFFLINE") != NULL) 
            {
                printf("The other party is offline\n");
                break;
            }
        }
    }
    
    printf("\n╔═════════════════════════════════════════════════════╗\n");
    printf("║             Press Enter to continue...              ║\n");
	printf("╚═════════════════════════════════════════════════════╝\n");
    clear_input_buffer(); 
}


//未完成
void Group_chat_menu()
{
    printf("\n=========================================\n");
    printf("            群聊功能                      \n");
    printf("=========================================\n");
    printf("暂未实现，按回车键返回...");
    getchar();
    fflush(stdin);
}

void Friend_chat_menu()
{
    system("clear");
    printf("\n=========================================\n");
    printf("            好友聊天                      \n");
    printf("=========================================\n");
    printf("暂未实现，按回车键返回...");
    getchar();
    fflush(stdin);
}
void Add_friend_menu()
{
    system("clear");
    printf("\n=========================================\n");
    printf("            添加好友                      \n");
    printf("=========================================\n");
    printf("暂未实现，按回车键返回...");
    getchar();
    fflush(stdin);
}   